package cn.itcast.mq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;

import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @Author: ahcfl
 * @Date: 2021年07月20日 21:51
 * @Description:  消费失败重试机制
 * 在开启重试模式后，重试次数耗尽，如果消息依然失败，则需要有MessageRecovery接口来处理，
 * 失败策略 它包含三种不同的实现： consumer处理失败消息 给 失败交换机 放到 失败队列
 * - RejectAndDontRequeueRecoverer：重试耗尽后，直接reject，丢弃消息。默认就是这种方式
 * - ImmediateRequeueMessageRecoverer：重试耗尽后，返回nack，消息重新入队
 * - RepublishMessageRecoverer：重试耗尽后，将失败消息投递到指定的交换机，后续由人工集中处理。
 */
//@Configuration
public class ErrorMsgConfig {

    // 定义处理失败消息的交换机和队列 演示 失败策略
    @Bean
    public DirectExchange errorMsgExchange() {
        return new DirectExchange("error.direct");
    }

    @Bean
    public Queue errorMsgQueue() {
        return new Queue("error.queue");
    }

   /* @Bean
    public Binding errorBinding() {
        return BindingBuilder
                .bind(errorMsgQueue())
                .to(errorMsgExchange())
                .with("error");
    }*/

    @Bean
    public MessageRecoverer republishMessageRecover(RabbitTemplate rabbitTemplate){
        return  new RepublishMessageRecoverer(rabbitTemplate,
                "error.direct", "error");
    }
}
